<?php

class PhotosController extends \BaseController {

    /**
     * The layout that should be used for responses.
     */
    protected $layout = 'user.layouts';

    /**
     * Display a listing of photos
     *
     * @return Response
     */
    public function index() {
        $photos = Photo::getallactived();
//                foreach ($photos as $value) {
//                    echo $value->title ." <br/>";
//                }
        return View::make('user.photos.index', compact('photos'));
    }

    /**
     * Show the form for creating a new photo
     *
     * @return Response
     */
    public function create() {
        if (isset($_FILES["myfile"])) {
            // size full
            $widthFull = 960;
            $heigthFull = 800;
            // size thumb
            $widthThumb = 570;
            $heigthThumb = 400;
            // path full
            $pathFull = public_path().'\\assets\\img\\work\\full\\';
            // path thumb
            $pathThumb = public_path().'\\assets\\img\\work\\thumbs\\';
            //echo public_path(); die();
            $ret = array();
            $error = $_FILES["myfile"]["error"];
            //You need to handle  both cases
            //If Any browser does not support serializing of multiple files using FormData() 
            if (!is_array($_FILES["myfile"]["name"])) { //single file
                $photo = new Photo();
                $photo->category = 'design';
                $photo->group = 'gallery';
                $photo->save();
                $id = $photo->id;
                $fileName = "image-".$id.".jpg";
                $photo->img = $fileName;
                $photo->url = $fileName;
                $photo->save();
                
                //$f = resizeImage($_FILES["myfile"]["tmp_name"], '150', '120');
                move_uploaded_file($_FILES["myfile"]["tmp_name"], $pathFull . $fileName);
                copy($pathFull . $fileName, $pathThumb . $fileName);
                //move_uploaded_file($_FILES["myfile"]["tmp_name"], $pathThumb . $fileName);
                //resizeImage($output_dir . $fileName, '10', '10');
                $this->smart_resize_image($pathFull . $fileName , null, $widthFull , $heigthFull , false , $pathFull . $fileName , false , false ,100 );
                $this->smart_resize_image($pathThumb . $fileName , null, $widthThumb , $heigthThumb , false , $pathThumb . $fileName , false , false ,100 );
                $ret[] = $fileName;
                
            } else {  //Multiple files, file[]
                $fileCount = count($_FILES["myfile"]["name"]);
                for ($i = 0; $i < $fileCount; $i++) {
                    $photo = new Photo();
                    $photo->category = 'design';
                    $photo->group = 'gallery';
                    $photo->save();
                    $id = $photo->id;
                    $fileName = "image-".$id.".jpg";
                    $photo->img = $fileName;
                    $photo->url = $fileName;
                    $photo->save();
//                    $fileName = $_FILES["myfile"]["name"][$i];
                    move_uploaded_file($_FILES["myfile"]["tmp_name"], $pathFull . $fileName);
//                    move_uploaded_file($_FILES["myfile"]["tmp_name"], $pathThumb . $fileName);
                    copy($pathFull . $fileName, $pathThumb . $fileName);
                    //resize
                    $this->smart_resize_image($pathFull . $fileName , null, $widthFull , $heigthFull , false , $pathFull . $fileName , false , false ,100 );
                    $this->smart_resize_image($pathThumb . $fileName , null, $widthThumb , $heigthThumb , false , $pathThumb . $fileName , false , false ,100 );
                    $ret[] = $fileName;
                }
            }
                echo json_encode($ret);
            }
            return View::make('user.photos.create');
    }

    /**
     * Store a newly created photo in storage.
     *
     * @return Response
     */
    public function store() {
        $validator = Validator::make($data = Input::all(), Photo::$rules);

        if ($validator->fails()) {
            return Redirect::back()->withErrors($validator)->withInput();
        }

        Photo::create($data);

        return Redirect::route('user.photos.index');
    }

    /**
     * Display the specified photo.
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id) {
        $photo = Photo::findOrFail($id);

        return View::make('user.photos.show', compact('photo'));
    }

    /**
     * Show the form for editing the specified photo.
     *
     * @param  int  $id
     * @return Response
     */
    public function edit() {
        $photos = Photo::getall();

        return View::make('user.photos.edit', compact('photos'));
    }

    /**
     * Update the specified photo in storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function update($id) {
        $photo = Photo::findOrFail($id);

        $validator = Validator::make($data = Input::all(), Photo::$rules);

        if ($validator->fails()) {
            return Redirect::back()->withErrors($validator)->withInput();
        }

        $photo->update($data);

        return Redirect::route('user.photos.index');
    }

    /**
     * Remove the specified photo from storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function destroy($id) {
        $photo = Photo::findOrFail($id);
        $photo->delif = 0;
        $photo->save();
    }
    
    /**
     * easy image resize function
     * @param  $file - file name to resize
     * @param  $string - The image data, as a string
     * @param  $width - new image width
     * @param  $height - new image height
     * @param  $proportional - keep image proportional, default is no
     * @param  $output - name of the new file (include path if needed)
     * @param  $delete_original - if true the original image will be deleted
     * @param  $use_linux_commands - if set to true will use "rm" to delete the image, if false will use PHP unlink
     * @param  $quality - enter 1-100 (100 is best quality) default is 100
     * @return boolean|resource
     */
    private function smart_resize_image($file, $string = null, 
            $width = 0, 
            $height = 0, 
            $proportional = false, 
            $output = 'file', 
            $delete_original = true, 
            $use_linux_commands = false, 
            $quality = 100
    ) {

        if ($height <= 0 && $width <= 0)
            return false;
        if ($file === null && $string === null)
            return false;

        # Setting defaults and meta
        $info = $file !== null ? getimagesize($file) : getimagesizefromstring($string);
        $image = '';
        $final_width = 0;
        $final_height = 0;
        list($width_old, $height_old) = $info;
        $cropHeight = $cropWidth = 0;

        # Calculating proportionality
        if ($proportional) {
            if ($width == 0)
                $factor = $height / $height_old;
            elseif ($height == 0)
                $factor = $width / $width_old;
            else
                $factor = min($width / $width_old, $height / $height_old);

            $final_width = round($width_old * $factor);
            $final_height = round($height_old * $factor);
        }
        else {
            $final_width = ( $width <= 0 ) ? $width_old : $width;
            $final_height = ( $height <= 0 ) ? $height_old : $height;
            $widthX = $width_old / $width;
            $heightX = $height_old / $height;

            $x = min($widthX, $heightX);
            $cropWidth = ($width_old - $width * $x) / 2;
            $cropHeight = ($height_old - $height * $x) / 2;
        }

        # Loading image to memory according to type
        switch ($info[2]) {
            case IMAGETYPE_JPEG: $file !== null ? $image = imagecreatefromjpeg($file) : $image = imagecreatefromstring($string);
                break;
            case IMAGETYPE_GIF: $file !== null ? $image = imagecreatefromgif($file) : $image = imagecreatefromstring($string);
                break;
            case IMAGETYPE_PNG: $file !== null ? $image = imagecreatefrompng($file) : $image = imagecreatefromstring($string);
                break;
            default: return false;
        }


        # This is the resizing/resampling/transparency-preserving magic
        $image_resized = imagecreatetruecolor($final_width, $final_height);
        if (($info[2] == IMAGETYPE_GIF) || ($info[2] == IMAGETYPE_PNG)) {
            $transparency = imagecolortransparent($image);
            $palletsize = imagecolorstotal($image);

            if ($transparency >= 0 && $transparency < $palletsize) {
                $transparent_color = imagecolorsforindex($image, $transparency);
                $transparency = imagecolorallocate($image_resized, $transparent_color['red'], $transparent_color['green'], $transparent_color['blue']);
                imagefill($image_resized, 0, 0, $transparency);
                imagecolortransparent($image_resized, $transparency);
            } elseif ($info[2] == IMAGETYPE_PNG) {
                imagealphablending($image_resized, false);
                $color = imagecolorallocatealpha($image_resized, 0, 0, 0, 127);
                imagefill($image_resized, 0, 0, $color);
                imagesavealpha($image_resized, true);
            }
        }
        imagecopyresampled($image_resized, $image, 0, 0, $cropWidth, $cropHeight, $final_width, $final_height, $width_old - 2 * $cropWidth, $height_old - 2 * $cropHeight);


        # Taking care of original, if needed
        if ($delete_original) {
            if ($use_linux_commands)
                exec('rm ' . $file);
            else
                @unlink($file);
        }

        # Preparing a method of providing result
        switch (strtolower($output)) {
            case 'browser':
                $mime = image_type_to_mime_type($info[2]);
                header("Content-type: $mime");
                $output = NULL;
                break;
            case 'file':
                $output = $file;
                break;
            case 'return':
                return $image_resized;
                break;
            default:
                break;
        }

        # Writing image according to type to the output destination and image quality
        switch ($info[2]) {
            case IMAGETYPE_GIF: imagegif($image_resized, $output);
                break;
            case IMAGETYPE_JPEG: imagejpeg($image_resized, $output, $quality);
                break;
            case IMAGETYPE_PNG:
                $quality = 9 - (int) ((0.9 * $quality) / 10.0);
                imagepng($image_resized, $output, $quality);
                break;
            default: return false;
        }

        return true;
    }

}
